/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pos.beans;

import entities.Almacen;
import entities.AlmacenTienda;
import entities.Caja;
import entities.Cliente;
import entities.FormaPago;
import entities.Iva;
import entities.LineaTicket;
import entities.Producto;
import entities.ProductoTalla;
import entities.PvpInternacional;
import entities.Ticket;
import entities.TicketFormaPago;
import entities.Tienda;
import entities.Usuario;
import entities.UsuarioTienda;
import facades.AlmacenFacade;
import facades.ClienteFacade;
import facades.FormaPagoFacade;
import facades.IvaFacade;
import facades.LineaInventarioAlmacenFacade;
import facades.NivelPrecioPaisFacade;
import facades.ProductoTallaFacade;
import facades.PvpInternacionalFacade;
import facades.TicketFormaPagoFacade;
import facades.TipoTicketFacade;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import org.primefaces.context.RequestContext;
import pos.qualifiers.EventoIrANuevoTicket;
import pos.qualifiers.EventoNuevoTicketAPartirDeReserva;
import productos.datamodel.FiltroProductos;
import qualifiers.EventoEntidadCreada;
import qualifiers.EventoEntidadEditada;
import qualifiers.EventoEntidadElegida;
import qualifiers.EventoPreCrearEntidad;
import qualifiers.UsuarioLogeado;

/**
 *
 * @author damfercer
 */
@Named(value = "nuevoTicketBean")
@SessionScoped
public class NuevoTicketBean extends FiltroProductos implements Serializable{
    @Inject
    TipoTicketFacade tipoTicketFacade;
    @Inject
    @EventoPreCrearEntidad
    Event<Cliente> eventoPreCrearCliente;
    @Inject
    @EventoEntidadCreada
    Event<Cliente> eventoClienteCreado;
    @Inject
    IvaFacade ivaFacade;
    @Inject
    AlmacenFacade almacenFacade;
    @Inject
    ClienteFacade clienteFacade;
    @Inject
    @UsuarioLogeado
    Usuario usuario;
    @Inject
    FormaPagoFacade formaPagoFacade;
    @Inject
    ProductoTallaFacade productoTallaFacade;
    @Inject
    PvpInternacionalFacade pvpInternacionalFacade;
    @Inject
    NivelPrecioPaisFacade nivelPrecioPaisFacade;
    @Inject
    LineaInventarioAlmacenFacade lineaInventarioAlmacenFacade;
    @Inject
    TicketFormaPagoFacade ticketFormaPagoFacade;
    private List<Caja> cajasUsuario;
    private Ticket ticket;
    private BigInteger codigoBarras;
    private Cliente nuevoCliente;
    private List<LineaTicket> lineasTicketAdd;
    private Boolean noQuiereRegistar;
    private Map<Integer,Integer> mapaInventario;
    private List<Almacen> almacenesVentasAsociados;
    private TicketFormaPago efectivoTicketFormaPago;
    private BigDecimal efectivoRecibe;
    private TicketFormaPago amexTicketFormaPago;
    private TicketFormaPago visaTicketFormaPago;
    private TicketFormaPago mastercardTicketFormaPago;
    private TicketFormaPago maestroTicketFormaPago;
    private TicketFormaPago transferenciaTicketFormaPago;
    @Inject
    @EventoPreCrearEntidad
    private Event<Ticket> eventoPreCrearTicket;
    @Inject
    @EventoEntidadElegida
    private Event<Cliente> eventoClienteElegido;
    private Boolean hayProblemasDeStock;
    private Ticket reserva;
    /**
     * Creates a new instance of NuevoTicketBean
     */
    public NuevoTicketBean() {
        
    }
    //Entre la opción de buscar entre un map <idproductotalla, cantidad> y mirar en el propio array
    //hemos decidido tomar la segunda opción ya que la cesta media es 1.8 productos, y el tiempo de
    // ejecución no va a incrementarse frente al uso de memoria y complejidad del mapa.
    @PostConstruct
    public void init(){
        hayProblemasDeStock=false;
        noQuiereRegistar=false;
        mapaInventario=new HashMap<Integer, Integer>();
        lineasTicketAdd=new ArrayList<LineaTicket>();
        ticket=new Ticket();
        ticket.setTicketFormaPagoList(new ArrayList<TicketFormaPago>());
        ticket.setLineaTicketList(new ArrayList<LineaTicket>());
        this.cajasUsuario=new ArrayList<Caja>();
        for(UsuarioTienda usuarioTienda: usuario.getUsuarioTiendaList()){
            Tienda t=usuarioTienda.getTienda();
            for (Caja caja : t.getCajaList()) {
                cajasUsuario.add(caja);
            }
        }
        for(FormaPago formaPago: formaPagoFacade.findAll()){
            TicketFormaPago ticketFormaPago=new TicketFormaPago();
            ticketFormaPago.setFormaPago(formaPago);
            ticket.getTicketFormaPagoList().add(ticketFormaPago);
        }
        nuevoCliente=new Cliente();
        efectivoTicketFormaPago=new TicketFormaPago();
        efectivoTicketFormaPago.setFormaPago(formaPagoFacade.getFormaPagoEfectivo());
        amexTicketFormaPago=new TicketFormaPago();
        amexTicketFormaPago.setFormaPago(formaPagoFacade.getFormaPagoAmex());
        visaTicketFormaPago=new TicketFormaPago();
        visaTicketFormaPago.setFormaPago(formaPagoFacade.getFormaPagoVisa());
        mastercardTicketFormaPago=new TicketFormaPago();
        mastercardTicketFormaPago.setFormaPago(formaPagoFacade.getFormaPagoMasterCard());
        maestroTicketFormaPago=new TicketFormaPago();
        maestroTicketFormaPago.setFormaPago(formaPagoFacade.getFormaPagoMaestro());
        transferenciaTicketFormaPago=new TicketFormaPago();
        transferenciaTicketFormaPago.setFormaPago(formaPagoFacade.getFormaPagoTransferencia());
        reserva=null;
    }
    /**
     * @return the cajasUsuario
     */
    public List<Caja> getCajasUsuario() {
        return cajasUsuario;
    }

    /**
     * @param cajasUsuario the cajasUsuario to set
     */
    public void setCajasUsuario(List<Caja> cajasUsuario) {
        this.cajasUsuario = cajasUsuario;
    }

    /**
     * @return the ticket
     */
    public Ticket getTicket() {
        return ticket;
    }

    /**
     * @param ticket the ticket to set
     */
    public void setTicket(Ticket ticket) {
        this.ticket = ticket;
    }

    /**
     * @return the codigoBarras
     */
    public BigInteger getCodigoBarras() {
        return codigoBarras;
    }

    /**
     * @param codigoBarras the codigoBarras to set
     */
    public void setCodigoBarras(BigInteger codigoBarras) {
        this.codigoBarras = codigoBarras;
    }
    
    public void onCodigoBarrasCambiado(){
        if(this.ticket.getCaja()!=null){
            ProductoTalla productoTalla=productoTallaFacade.getProductoTallaDeCodigoDeBarras(codigoBarras);
            if(productoTalla!=null){
                LineaTicket nuevaLineaTicket=recuperarLineaTicketDeProductoTalla(productoTalla);
                if(nuevaLineaTicket==null){
                    nuevaLineaTicket=new LineaTicket();
                    nuevaLineaTicket.setCantidad(1);
                    nuevaLineaTicket.setDescuento(BigDecimal.ZERO);
                    if(this.ticket.getCliente()!=null && this.ticket.getCliente().getDescuento()!=null){
                        nuevaLineaTicket.setDescuento(this.ticket.getCliente().getDescuento());
                    }
                    PvpInternacional pvpInternacionalProducto=pvpInternacionalFacade.getPvpInternacionalDeProductoNivelPrecioYPais(productoTalla.getProducto(), this.ticket.getCaja().getTienda().getPais(), nivelPrecioPaisFacade.getNivelPrecioPais(this.ticket.getCaja().getTienda().getPais()));
                    if(pvpInternacionalProducto!=null){
                        nuevaLineaTicket.setTotal(pvpInternacionalProducto.getPvp());
                    }
                    else{
                        nuevaLineaTicket.setTotal(productoTalla.getProducto().getPvp());
                    }
                    //TODO: IVA
                    BigDecimal ivaDecimal=BigDecimal.ZERO;
                    Iva iva=ivaFacade.getIvaDePaisYCategoria(ticket.getCaja().getTienda().getPais(), productoTalla.getProducto().getD());
                    if(iva!=null){
                        ivaDecimal=iva.getIva();
                    }
                    nuevaLineaTicket.setIva(ivaDecimal);
                    nuevaLineaTicket.setProductoTalla(productoTalla);
                    this.ticket.getLineaTicketList().add(nuevaLineaTicket);
                }
                else{
                    nuevaLineaTicket.setCantidad(nuevaLineaTicket.getCantidad()+1);
                }
                if(ticket.getTipoTicket().getIdTipoTicket()==1){
                    onLineaTicketCambiada(nuevaLineaTicket);
                }
                else if(ticket.getTipoTicket().getIdTipoTicket()==2){
                    onLineaTicketCambiadaReserva(nuevaLineaTicket);
                }
            }
            else{
                FacesContext context = FacesContext.getCurrentInstance();
                Locale locale=context.getViewRoot().getLocale();
                ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
                String errorNoPedidoElegido=rb.getString("ErrorNoExisteProductoTallaDeCodigoDeBarras");
                FacesMessage msg =new FacesMessage(errorNoPedidoElegido,errorNoPedidoElegido);
                msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                context.addMessage(null, msg);
                context.renderResponse();
            }
            
        }
        this.codigoBarras=null;
    }
    
    public void onIrANuevoTicket(@Observes @EventoIrANuevoTicket String string){
        init();
    }
    
    public void onLineaTicketCambiada(LineaTicket lineaTicket){
        Integer cantidadEnAlmacenes=lineaInventarioAlmacenFacade.getCantidadDeProductoTallaEnAlmacenes(lineaTicket.getProductoTalla(), almacenesVentasAsociados);
        if(lineaTicket.getCantidad()==0){
            ticket.getLineaTicketList().remove(lineaTicket);
            /*for(Iterator<LineaTicket> it = lineasTicketAdd.iterator(); it.hasNext();){
                LineaTicket lineaTicketAdd=it.next();
                if(lineaTicketAdd.getCantidad()==0){
                    it.remove();
                }
            }*/
        }
        else if(lineaTicket.getCantidad()>cantidadEnAlmacenes){
            List<Almacen> almacenesReservas=new ArrayList<Almacen>();
            for (Almacen almacen : almacenesVentasAsociados) {
                almacenesReservas.addAll(almacen.getAlmacenList());
            }
            if(lineaInventarioAlmacenFacade.getCantidadDeProductoTallaEnAlmacenes(lineaTicket.getProductoTalla(), almacenesReservas)>0){
                FacesContext context = FacesContext.getCurrentInstance();
                Locale locale=context.getViewRoot().getLocale();
                ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
                String errorNoPedidoElegido=rb.getString("ErrorCantidadReservadaPos");
                FacesMessage msg =new FacesMessage(errorNoPedidoElegido,errorNoPedidoElegido);
                msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                context.addMessage(null, msg);
                context.renderResponse();
            }
            else{
                FacesContext context = FacesContext.getCurrentInstance();
                Locale locale=context.getViewRoot().getLocale();
                ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
                String errorNoPedidoElegido=rb.getString("ErrorCantidadSuperadaPos");
                FacesMessage msg =new FacesMessage(errorNoPedidoElegido,errorNoPedidoElegido);
                msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                context.addMessage(null, msg);
                context.renderResponse();
            }
        }
    }
    
    public void onLineaTicketCambiadaReserva(LineaTicket lineaTicket){
        Integer cantidadEnAlmacenes=lineaInventarioAlmacenFacade.getCantidadDeProductoTallaEnAlmacenes(lineaTicket.getProductoTalla(), almacenesVentasAsociados);
        if(lineaTicket.getCantidad()==0){
            ticket.getLineaTicketList().remove(lineaTicket);
            /*for(Iterator<LineaTicket> it = lineasTicketAdd.iterator(); it.hasNext();){
                LineaTicket lineaTicketAdd=it.next();
                if(lineaTicketAdd.getCantidad()==0){
                    it.remove();
                }
            }*/
        }
        else if(lineaTicket.getCantidad()>cantidadEnAlmacenes){
            FacesContext context = FacesContext.getCurrentInstance();
            Locale locale=context.getViewRoot().getLocale();
            ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
            String errorNoPedidoElegido=rb.getString("ErrorCantidadSuperadaPos");
            FacesMessage msg =new FacesMessage(errorNoPedidoElegido,errorNoPedidoElegido);
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            context.addMessage(null, msg);
            context.renderResponse();
        }
    }
    
    public LineaTicket recuperarLineaTicketDeProductoTalla(ProductoTalla pt){
        LineaTicket lineaEncontrada=null;
        for(LineaTicket lineaTicket : this.ticket.getLineaTicketList()){
            if(lineaTicket.getProductoTalla().equals(pt)){
                lineaEncontrada=lineaTicket;
                break;
            }
        }
        return lineaEncontrada;
    }

    /**
     * @return the nuevoCliente
     */
    public Cliente getNuevoCliente() {
        return nuevoCliente;
    }

    /**
     * @param nuevoCliente the nuevoCliente to set
     */
    public void setNuevoCliente(Cliente nuevoCliente) {
        this.nuevoCliente = nuevoCliente;
    }
    
    public void guardarCliente(){
        eventoPreCrearCliente.fire(nuevoCliente);
        clienteFacade.create(nuevoCliente);
        eventoClienteCreado.fire(nuevoCliente);
        ticket.setCliente(nuevoCliente);
        nuevoCliente=new Cliente();
    }
    
    @Override
    public List<Producto> filtrar(){
        this.lineasTicketAdd=new ArrayList<LineaTicket>();
        String sql=getFiltradoSQLGenerator().generateSQL(getFiltradoDataModel());
        List<Producto> productos=getProductoFacade().filtrarProductos(sql);
        for (Producto producto : productos) {
            List<ProductoTalla> productosTalla=producto.getProductoTallaList();
            for (ProductoTalla productoTalla : productosTalla) {
                LineaTicket lineaTicket=new LineaTicket();
                lineaTicket.setCantidad(0);
                if(this.ticket.getCliente()!=null && this.ticket.getCliente().getDescuento()!=null){
                    lineaTicket.setDescuento(this.ticket.getCliente().getDescuento());
                }
                PvpInternacional pvpInternacionalProducto=pvpInternacionalFacade.getPvpInternacionalDeProductoNivelPrecioYPais(productoTalla.getProducto(), this.ticket.getCaja().getTienda().getPais(), nivelPrecioPaisFacade.getNivelPrecioPais(this.ticket.getCaja().getTienda().getPais()));
                if(pvpInternacionalProducto!=null){
                    lineaTicket.setTotal(pvpInternacionalProducto.getPvp());
                }
                else{
                    lineaTicket.setTotal(productoTalla.getProducto().getPvp());
                }
                lineaTicket.setProductoTalla(productoTalla);
                this.lineasTicketAdd.add(lineaTicket);
            }
        }
        return null;
    }
    
    public void onCajaElegida(){
        almacenesVentasAsociados=new ArrayList<Almacen>();
        Tienda tienda=ticket.getCaja().getTienda();
        for (AlmacenTienda almacenTienda : tienda.getAlmacenTiendaList()) {
            if(almacenTienda.getAlmacen().getTipoAlmacen().getIdTipoAlmacen()==1){
                almacenesVentasAsociados.add(almacenTienda.getAlmacen());
            }
        }
    }
    
    public void cobrarRestante(){
        BigDecimal restante=getTotalAPagar().subtract(getTotalCobradoSinEfectivo());
        efectivoTicketFormaPago.setCantidad(restante);
    }
    
    public BigDecimal getTotalCobradoSinEfectivo(){
        BigDecimal total=BigDecimal.ZERO;
        if(amexTicketFormaPago.getCantidad()!=null){
            total=total.add(amexTicketFormaPago.getCantidad());
        }
        if(visaTicketFormaPago.getCantidad()!=null){
            total=total.add(visaTicketFormaPago.getCantidad());
        }
        if(mastercardTicketFormaPago.getCantidad()!=null){
            total=total.add(mastercardTicketFormaPago.getCantidad());
        }
        if(maestroTicketFormaPago.getCantidad()!=null){
            total=total.add(maestroTicketFormaPago.getCantidad());
        }
        if(transferenciaTicketFormaPago.getCantidad()!=null){
            total=total.add(transferenciaTicketFormaPago.getCantidad());
        }
        return total;
    }
    
    public BigDecimal getTotalCobrado(){
        BigDecimal total=BigDecimal.ZERO;
        if(amexTicketFormaPago.getCantidad()!=null){
            total=total.add(amexTicketFormaPago.getCantidad());
        }
        if(visaTicketFormaPago.getCantidad()!=null){
            total=total.add(visaTicketFormaPago.getCantidad());
        }
        if(mastercardTicketFormaPago.getCantidad()!=null){
            total=total.add(mastercardTicketFormaPago.getCantidad());
        }
        if(maestroTicketFormaPago.getCantidad()!=null){
            total=total.add(maestroTicketFormaPago.getCantidad());
        }
        if(transferenciaTicketFormaPago.getCantidad()!=null){
            total=total.add(transferenciaTicketFormaPago.getCantidad());
        }
        if(efectivoTicketFormaPago.getCantidad()!=null){
            total=total.add(efectivoTicketFormaPago.getCantidad());
        }
        return total;
    }
    
    public BigDecimal getRestante(){
        if(reserva==null){
            return getTotalAPagar().subtract(getTotalCobrado());
        }
        else{
            return getTotalAPagar().subtract(getTotalCobrado()).subtract(reserva.getTotalPagado());
        }
    }
    
    public void guardarLineasAdd(){
        for (LineaTicket lineaTicket : lineasTicketAdd) {
            if(lineaTicket.getCantidad()>0){
                ticket.getLineaTicketList().add(lineaTicket);
            }
        }
        lineasTicketAdd=new ArrayList<LineaTicket>();
    }
    
    public void eliminarLineasAdd(){
        lineasTicketAdd=new ArrayList<LineaTicket>();
    }
    
    public BigDecimal getTotalAPagar(){
        BigDecimal total=BigDecimal.ZERO;
        if(ticket.getLineaTicketList()!=null){
            for (LineaTicket lineaTicket : ticket.getLineaTicketList()) {
                BigDecimal totalLinea=lineaTicket.getTotal().multiply(new BigDecimal(lineaTicket.getCantidad()));
                if(lineaTicket.getDescuento()!=null && !lineaTicket.getDescuento().equals(BigDecimal.ZERO)){
                    BigDecimal cien=new BigDecimal(100);
                    BigDecimal conDescuento=cien.subtract(lineaTicket.getDescuento());
                    BigDecimal multiplicarDescuento=conDescuento.divide(cien);
                    total=total.add(totalLinea.multiply(multiplicarDescuento));
                }
                else{
                    total=total.add(totalLinea);
                }
            }
        }
        return total;
    }
    
    public void asignarFormasPago(){
        ticket.setTicketFormaPagoList(new ArrayList<TicketFormaPago>());
        if(efectivoTicketFormaPago!=null && efectivoTicketFormaPago.getCantidad()!=null && efectivoTicketFormaPago.getCantidad().compareTo(BigDecimal.ZERO)!=0){
            ticket.getTicketFormaPagoList().add(efectivoTicketFormaPago);
        }
        if(visaTicketFormaPago!=null && visaTicketFormaPago.getCantidad()!=null && visaTicketFormaPago.getCantidad().compareTo(BigDecimal.ZERO)!=0){
            ticket.getTicketFormaPagoList().add(visaTicketFormaPago);
        }
        if(amexTicketFormaPago!=null && amexTicketFormaPago.getCantidad()!=null && amexTicketFormaPago.getCantidad().compareTo(BigDecimal.ZERO)!=0){
            ticket.getTicketFormaPagoList().add(amexTicketFormaPago);
        }
        if(mastercardTicketFormaPago!=null && mastercardTicketFormaPago.getCantidad()!=null && mastercardTicketFormaPago.getCantidad().compareTo(BigDecimal.ZERO)!=0){
            ticket.getTicketFormaPagoList().add(mastercardTicketFormaPago);
        }
        if(maestroTicketFormaPago!=null && maestroTicketFormaPago.getCantidad()!=null && maestroTicketFormaPago.getCantidad().compareTo(BigDecimal.ZERO)!=0){
            ticket.getTicketFormaPagoList().add(mastercardTicketFormaPago);
        }
        if(transferenciaTicketFormaPago!=null && transferenciaTicketFormaPago.getCantidad()!=null && transferenciaTicketFormaPago.getCantidad().compareTo(BigDecimal.ZERO)!=0){
            ticket.getTicketFormaPagoList().add(transferenciaTicketFormaPago);
        }
    }
    
    public void reasignarAlmacenes(){
        if(almacenesVentasAsociados!=null && !almacenesVentasAsociados.isEmpty()){
            Almacen almacenAleatorioConTodosLosProductos=almacenFacade.getAlmacenAleatorioConTodosLosProductosAbstract(null, getMapaDeLineaTicket(this.ticket.getLineaTicketList()), almacenesVentasAsociados);
            if(almacenAleatorioConTodosLosProductos!=null){
                for (LineaTicket lineaTicket : this.ticket.getLineaTicketList()) {
                    lineaTicket.setAlmacen(almacenAleatorioConTodosLosProductos);
                }
            }
            else{
                for (LineaTicket lineaTicket : this.ticket.getLineaTicketList()) {
                    ArrayList<LineaTicket> lineaArray=new ArrayList<LineaTicket>();
                    lineaArray.add(lineaTicket);
                    Almacen almacenAleatorioConLinea=almacenFacade.getAlmacenAleatorioConTodosLosProductosAbstract(null, getMapaDeLineaTicket(lineaArray), almacenesVentasAsociados);
                    if(almacenAleatorioConLinea!=null){
                        lineaTicket.setAlmacen(almacenAleatorioConLinea);
                    }
                    else{
                        hayProblemasDeStock=true;
                        //TODO: Lógica para cuando un almacén no tiene una línea que vende
                        lineaTicket.setAlmacen(almacenesVentasAsociados.get(0));
                    }
                }
            }
        }
    }
    
    public void reasignarAlmacenesReserva(){
        if(almacenesVentasAsociados!=null && !almacenesVentasAsociados.isEmpty()){
            Almacen almacenAleatorioConTodosLosProductos=almacenFacade.getAlmacenAleatorioConTodosLosProductosAbstract(null, getMapaDeLineaTicket(this.ticket.getLineaTicketList()), almacenesVentasAsociados);
            if(almacenAleatorioConTodosLosProductos!=null){
                for (LineaTicket lineaTicket : this.ticket.getLineaTicketList()) {
                    lineaTicket.setAlmacen(almacenAleatorioConTodosLosProductos.getAlmacenList().iterator().next());
                }
            }
            else{
                for (LineaTicket lineaTicket : this.ticket.getLineaTicketList()) {
                    ArrayList<LineaTicket> lineaArray=new ArrayList<LineaTicket>();
                    lineaArray.add(lineaTicket);
                    Almacen almacenAleatorioConLinea=almacenFacade.getAlmacenAleatorioConTodosLosProductosAbstract(null, getMapaDeLineaTicket(lineaArray), almacenesVentasAsociados);
                    if(almacenAleatorioConLinea!=null){
                        lineaTicket.setAlmacen(almacenAleatorioConLinea.getAlmacenList().iterator().next());
                    }
                    else{
                        hayProblemasDeStock=true;
                        //TODO: Lógica para cuando un almacén no tiene una línea que vende
                        lineaTicket.setAlmacen(almacenesVentasAsociados.get(0).getAlmacenList().iterator().next());
                    }
                }
            }
        }
    }
    
    public Map<ProductoTalla,Integer> getMapaDeLineaTicket(List<LineaTicket> lineasTicket){
        Map<ProductoTalla,Integer> mapaLineas=new HashMap<ProductoTalla, Integer>();
        for (LineaTicket lineaTicket : lineasTicket) {
            mapaLineas.put(lineaTicket.getProductoTalla(), lineaTicket.getCantidad());
        }
        return mapaLineas;
    }
    
    /**
     * @return the lineaTicketAdd
     */
    public List<LineaTicket> getLineasTicketAdd() {
        return lineasTicketAdd;
    }

    /**
     * @param lineaTicketAdd the lineaTicketAdd to set
     */
    public void setLineasTicketAdd(List<LineaTicket> lineaTicketAdd) {
        this.lineasTicketAdd = lineaTicketAdd;
    }

    /**
     * @return the noQuiereRegistar
     */
    public Boolean getNoQuiereRegistar() {
        return noQuiereRegistar;
    }

    /**
     * @param noQuiereRegistar the noQuiereRegistar to set
     */
    public void setNoQuiereRegistar(Boolean noQuiereRegistar) {
        this.noQuiereRegistar = noQuiereRegistar;
    }

    /**
     * @return the almacenesVentasAsociados
     */
    public List<Almacen> getAlmacenesVentasAsociados() {
        return almacenesVentasAsociados;
    }

    /**
     * @param almacenesVentasAsociados the almacenesVentasAsociados to set
     */
    public void setAlmacenesVentasAsociados(List<Almacen> almacenesVentasAsociados) {
        this.almacenesVentasAsociados = almacenesVentasAsociados;
    }

    /**
     * @return the efectivoTicketFormaPago
     */
    public TicketFormaPago getEfectivoTicketFormaPago() {
        return efectivoTicketFormaPago;
    }

    /**
     * @param efectivoTicketFormaPago the efectivoTicketFormaPago to set
     */
    public void setEfectivoTicketFormaPago(TicketFormaPago efectivoTicketFormaPago) {
        this.efectivoTicketFormaPago = efectivoTicketFormaPago;
    }

    /**
     * @return the amexTicketFormaPago
     */
    public TicketFormaPago getAmexTicketFormaPago() {
        return amexTicketFormaPago;
    }

    /**
     * @param amexTicketFormaPago the amexTicketFormaPago to set
     */
    public void setAmexTicketFormaPago(TicketFormaPago amexTicketFormaPago) {
        this.amexTicketFormaPago = amexTicketFormaPago;
    }

    /**
     * @return the visaTicketFormaPago
     */
    public TicketFormaPago getVisaTicketFormaPago() {
        return visaTicketFormaPago;
    }

    /**
     * @param visaTicketFormaPago the visaTicketFormaPago to set
     */
    public void setVisaTicketFormaPago(TicketFormaPago visaTicketFormaPago) {
        this.visaTicketFormaPago = visaTicketFormaPago;
    }

    /**
     * @return the mastercardTicketFormaPago
     */
    public TicketFormaPago getMastercardTicketFormaPago() {
        return mastercardTicketFormaPago;
    }

    /**
     * @param mastercardTicketFormaPago the mastercardTicketFormaPago to set
     */
    public void setMastercardTicketFormaPago(TicketFormaPago mastercardTicketFormaPago) {
        this.mastercardTicketFormaPago = mastercardTicketFormaPago;
    }

    /**
     * @return the maestroTicketFormaPago
     */
    public TicketFormaPago getMaestroTicketFormaPago() {
        return maestroTicketFormaPago;
    }

    /**
     * @param maestroTicketFormaPago the maestroTicketFormaPago to set
     */
    public void setMaestroTicketFormaPago(TicketFormaPago maestroTicketFormaPago) {
        this.maestroTicketFormaPago = maestroTicketFormaPago;
    }

    /**
     * @return the transferenciaTicketFormaPago
     */
    public TicketFormaPago getTransferenciaTicketFormaPago() {
        return transferenciaTicketFormaPago;
    }

    /**
     * @param transferenciaTicketFormaPago the transferenciaTicketFormaPago to set
     */
    public void setTransferenciaTicketFormaPago(TicketFormaPago transferenciaTicketFormaPago) {
        this.transferenciaTicketFormaPago = transferenciaTicketFormaPago;
    }

    /**
     * @return the efectivoRecibe
     */
    public BigDecimal getEfectivoRecibe() {
        return efectivoRecibe;
    }

    /**
     * @param efectivoRecibe the efectivoRecibe to set
     */
    public void setEfectivoRecibe(BigDecimal efectivoRecibe) {
        this.efectivoRecibe = efectivoRecibe;
    }

    public Boolean getPuedeTerminarVenta(){
        return getTicket().getLineaTicketList()!=null && !getTicket().getLineaTicketList().isEmpty() && getRestante().compareTo(BigDecimal.ZERO)==0;
    }
    
    public Boolean getPuedeTerminarReserva(){
        return getTicket().getLineaTicketList()!=null && !getTicket().getLineaTicketList().isEmpty();
    }
    
    public String crearReserva(){
        reasignarAlmacenesReserva();
        asignarFormasPago();
        String crearTicket=null;
        if(hayProblemasDeStock){
            RequestContext.getCurrentInstance().execute("dialogoErrorStock.show()");
        }
        else{
            crearTicket=confirmarTicket();
        }
        return crearTicket;
    }
    
    public String crearTicket(){
        reasignarAlmacenes();
        asignarFormasPago();
        String crearTicket=null;
        if(hayProblemasDeStock){
            RequestContext.getCurrentInstance().execute("dialogoErrorStock.show()");
        }
        else{
            crearTicket=confirmarTicket();
        }
        return crearTicket;
    }
    
    public String confirmarTicket(){
        ticket.setUsuario(usuario);
        eventoPreCrearTicket.fire(ticket);
        //init();
        return "/views/pos/ListadoTicketsTienda?faces-redirect=true";
    }
    /**
     * @return the hayProblemasDeStock
     */
    public Boolean getHayProblemasDeStock() {
        return hayProblemasDeStock;
    }

    /**
     * @param hayProblemasDeStock the hayProblemasDeStock to set
     */
    public void setHayProblemasDeStock(Boolean hayProblemasDeStock) {
        this.hayProblemasDeStock = hayProblemasDeStock;
    }
    
    public void tipoTicketVenta(){
        ticket.setTipoTicket(tipoTicketFacade.getTipoTicketVenta());
        if(getCajasUsuario().size()==1){
            ticket.setCaja(getCajasUsuario().get(0));
            onCajaElegida();
        }
    }
    
    public void tipoTicketReserva(){
        ticket.setTipoTicket(tipoTicketFacade.getTipoTicketReserva());
        if(getCajasUsuario().size()==1){
            ticket.setCaja(getCajasUsuario().get(0));
            onCajaElegida();
        }
    }
    
    public void elegirCliente(){
        eventoClienteElegido.fire(ticket.getCliente());
    }
    
    public void onEntidadEditada(@Observes @EventoEntidadEditada Cliente c){
        ticket.setCliente(c);
    }
    
    public void onEntidadCreada(@Observes @EventoEntidadCreada Cliente c){
        ticket.setCliente(c);
    }
    
    public void onTicketReservaElegido(@Observes @EventoNuevoTicketAPartirDeReserva Ticket t){
        reserva=t;
        ticket=new Ticket();
        ticket.setCliente(reserva.getCliente());
        ticket.setLineaTicketList(reserva.getLineaTicketList());
    }

    /**
     * @return the reserva
     */
    public Ticket getReserva() {
        return reserva;
    }

    /**
     * @param reserva the reserva to set
     */
    public void setReserva(Ticket reserva) {
        this.reserva = reserva;
    }
}


